/**
 * 本地存储工具类
 * 用于管理用户偏好设置和应用配置
 */

// 存储前缀，避免与其他应用冲突
const STORAGE_PREFIX = 'operation_delta_web_'

/**
 * 本地存储工具类
 */
export class Storage {
  /**
   * 设置本地存储项
   * @param key 键名
   * @param value 值
   * @param usePrefix 是否使用前缀，默认true
   */
  static set(key: string, value: any, usePrefix: boolean = true): void {
    const storageKey = usePrefix ? `${STORAGE_PREFIX}${key}` : key

    try {
      const storageValue = JSON.stringify({
        value,
        timestamp: new Date().getTime()
      })

      localStorage.setItem(storageKey, storageValue)
    } catch (error) {
      console.error('存储数据失败:', error)
    }
  }
  
  /**
   * 获取本地存储项
   * @param key 键名
   * @param defaultValue 默认值
   * @param usePrefix 是否使用前缀，默认true
   */
  static get<T>(key: string, defaultValue: T | null = null, usePrefix: boolean = true): T | null {
    const storageKey = usePrefix ? `${STORAGE_PREFIX}${key}` : key

    try {
      const storageItem = localStorage.getItem(storageKey)

      if (!storageItem) {
        return defaultValue
      }

      const { value } = JSON.parse(storageItem)
      return value as T
    } catch (error) {
      console.error('获取存储数据失败:', error)
      return defaultValue
    }
  }
  
  /**
   * 移除本地存储项
   * @param key 键名
   * @param usePrefix 是否使用前缀，默认true
   */
  static remove(key: string, usePrefix: boolean = true): void {
    const storageKey = usePrefix ? `${STORAGE_PREFIX}${key}` : key
    localStorage.removeItem(storageKey)
  }
  
  /**
   * 清除所有带前缀的存储项
   */
  static clear(): void {
    const keys = Object.keys(localStorage)
    keys.forEach(key => {
      if (key.startsWith(STORAGE_PREFIX)) {
        localStorage.removeItem(key)
      }
    })
  }
}

/**
 * 用户偏好设置管理
 */
export class UserPreferences {
  /**
   * 图表时间段偏好设置键名
   */
  static readonly CHART_PERIOD_KEY = 'chart_period_preference'

  /**
   * 图表时间点过滤偏好设置键名
   */
  static readonly CHART_TIME_FILTER_KEY = 'chart_time_filter_preference'

  /**
   * 获取图表时间段偏好
   * @param defaultPeriod 默认时间段，默认为'7d'
   * @returns 用户偏好的时间段
   */
  static getChartPeriod(defaultPeriod: string = '7d'): string {
    return Storage.get<string>(this.CHART_PERIOD_KEY, defaultPeriod) || defaultPeriod
  }

  /**
   * 设置图表时间段偏好
   * @param period 时间段值
   */
  static setChartPeriod(period: string): void {
    Storage.set(this.CHART_PERIOD_KEY, period)
  }

  /**
   * 获取图表时间点过滤偏好
   * @param defaultHours 默认时间点数组，默认为空数组（显示所有时间点）
   * @returns 用户偏好的时间点数组
   */
  static getChartTimeFilter(defaultHours: number[] = []): number[] {
    return Storage.get<number[]>(this.CHART_TIME_FILTER_KEY, defaultHours) || defaultHours
  }

  /**
   * 设置图表时间点过滤偏好
   * @param hours 时间点数组，例如 [1, 5, 10, 20] 表示只显示1点、5点、10点、20点的数据
   */
  static setChartTimeFilter(hours: number[]): void {
    Storage.set(this.CHART_TIME_FILTER_KEY, hours)
  }

  /**
   * 调试方法：检查localStorage中的实际存储内容
   */
  static debugStorage(): void {
    const fullKey = `operation_delta_web_${this.CHART_PERIOD_KEY}`
    const rawValue = localStorage.getItem(fullKey)
    console.log('=== 存储调试信息 ===')
    console.log('完整键名:', fullKey)
    console.log('原始存储值:', rawValue)
    if (rawValue) {
      try {
        const parsed = JSON.parse(rawValue)
        console.log('解析后的值:', parsed)
        console.log('实际时间段值:', parsed.value)
      } catch (e) {
        console.error('解析存储值失败:', e)
      }
    }
    console.log('通过getChartPeriod获取:', this.getChartPeriod())
    console.log('==================')
  }

  /**
   * 测试方法：手动测试存储功能
   */
  static testStorage(): void {
    console.log('=== 开始存储功能测试 ===')

    // 测试存储
    const testValue = '30d'
    console.log('1. 测试存储值:', testValue)
    this.setChartPeriod(testValue)

    // 测试读取
    console.log('2. 测试读取:')
    const retrieved = this.getChartPeriod()
    console.log('读取到的值:', retrieved)

    // 验证结果
    if (retrieved === testValue) {
      console.log('✅ 存储功能正常')
    } else {
      console.log('❌ 存储功能异常')
    }

    console.log('========================')
  }
}
